home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pinstaller / GLIClientConfiguration.py < prev    next >
Text File  |  2005-12-12  |  20KB  |  557 lines

  1. """
  2. # Copyright 1999-2005 Gentoo Foundation
  3. # This source code is distributed under the terms of version 2 of the GNU
  4. # General Public License as published by the Free Software Foundation, a copy
  5. # of which can be found in the main directory of this project.
  6. Gentoo Linux Installer
  7.  
  8. $Id: GLIClientConfiguration.py,v 1.42 2005/12/13 02:37:15 agaffney Exp $
  9. Copyright 2004 Gentoo Technologies Inc.
  10.  
  11. The GLIClientConfiguration module contains the ClientConfiguration class
  12. which is a singleton class that represents configuration data that is
  13. used by the installer client during installation. Data that is part of
  14. the actual install is contained in GLIInstallProfile.
  15.  
  16. Usage:
  17.     from GLIClientConfiguration import ClientConfiguration
  18.  
  19.     PROCEDURE TO ADD NEW VARIABLES:  (PLEASE KEEP IN ALPHABETICAL ORDER)
  20.     1. Add a handler to the list.  If the variable has children make sure you do it right.
  21.        Look at the existing structure to get an idea.
  22.     2. Create a section for the two or three functions.
  23.     3. Create the get_variable_name and set_variable_name functions.
  24.        Ensure the set function has correct error checking.
  25.     4. If a simple value, add to the list in the general serialize() function.
  26.        If more complex add a serialize_variable_name to the list of special cases.
  27.        Then add the serialize_variable_name function to the section for the variable.
  28. """
  29.  
  30. import string, re, GLIUtility, SimpleXMLParser, os.path
  31. import xml.dom.minidom
  32. from GLIException import *
  33.  
  34. class ClientConfiguration:
  35.  
  36.     ##
  37.     # Initializes the ClientConfiguration.
  38.     def __init__(self):
  39.         self._architecture_template = "x86"
  40.         self._profile_uri = ""
  41.     
  42.         # This is the full path to the logfile
  43.         self._log_file = "/var/log/installer.log"
  44.         
  45.         # This is the root mount point
  46.         self._root_mount_point = "/mnt/gentoo"
  47.  
  48.         # Initialize some variables so we never reference a variable that never exists.
  49.         self._dns_servers = ()
  50.         self._network_type = None
  51.         self._network_interface = ""
  52.         self._network_ip = ""
  53.         self._network_broadcast = ""
  54.         self._network_dhcp_options = ""
  55.         self._network_netmask = ""
  56.         self._network_gateway = ""
  57.         self._enable_ssh = False
  58.         self._root_passwd = ""
  59.         self._interactive = True
  60.         self._kernel_modules = ()
  61.         self._ftp_proxy = ""
  62.         self._http_proxy = ""
  63.         self._rsync_proxy = ""
  64.         self._verbose = False
  65.         self._install_mode = "normal"
  66.         self.data = ""  # used for serialization
  67.  
  68.         self._parser = SimpleXMLParser.SimpleXMLParser()
  69.  
  70.         self._parser.addHandler('client-configuration/architecture-template', self.set_architecture_template)
  71.         self._parser.addHandler('client-configuration/dns-servers', self.set_dns_servers)
  72.         self._parser.addHandler('client-configuration/enable-ssh', self.set_enable_ssh)
  73.         self._parser.addHandler('client-configuration/ftp-proxy', self.set_ftp_proxy)
  74.         self._parser.addHandler('client-configuration/http-proxy', self.set_http_proxy)
  75.         self._parser.addHandler('client-configuration/install-mode', self.set_install_mode)
  76.         self._parser.addHandler('client-configuration/interactive', self.set_interactive)
  77.         self._parser.addHandler('client-configuration/kernel-modules', self.set_kernel_modules)
  78.         self._parser.addHandler('client-configuration/log-file', self.set_log_file)
  79.         self._parser.addHandler('client-configuration/network-interface', self.set_network_interface)
  80.         self._parser.addHandler('client-configuration/network-ip', self.set_network_ip)
  81.         self._parser.addHandler('client-configuration/network-broadcast', self.set_network_broadcast)
  82.         self._parser.addHandler('client_configuration/network-dhcp-options', self.set_network_dhcp_options)
  83.         self._parser.addHandler('client-configuration/network-netmask', self.set_network_netmask)
  84.         self._parser.addHandler('client-configuration/network-gateway', self.set_network_gateway)
  85.         self._parser.addHandler('client-configuration/network-type', self.set_network_type)
  86.         self._parser.addHandler('client-configuration/profile-uri', self.set_profile_uri)
  87.         self._parser.addHandler('client-configuration/root-mount-point', self.set_root_mount_point)
  88.         self._parser.addHandler('client-configuration/root-passwd', self.set_root_passwd)
  89.         self._parser.addHandler('client-configuration/rsync-proxy', self.set_rsync_proxy)
  90.         self._parser.addHandler('client-configuration/verbose', self.set_verbose)
  91.     ##
  92.     # Parses the given filename populating the client_configuration.
  93.     # @param filename the file to be parsed.  This should be a URI actually.
  94.     def parse(self, filename):
  95.         self._parser.parse(filename)
  96.  
  97.     ##
  98.     # Serializes the Client Configuration into an XML format that is returned.
  99.     def serialize(self):
  100.         fntable ={    'architecture-template': self.get_architecture_template,
  101.                     'enable-ssh': self.get_enable_ssh,
  102.                     'ftp-proxy': self.get_ftp_proxy,
  103.                     'http-proxy': self.get_http_proxy,
  104.                     'install-mode': self.get_install_mode,
  105.                     'interactive': self.get_interactive,
  106.                     'log-file': self.get_log_file,
  107.                     'network-broadcast': self.get_network_broadcast,
  108.                     'network-dhcp-options': self.get_network_dhcp_options,
  109.                     'network-gateway': self.get_network_gateway,
  110.                     'network-interface': self.get_network_interface,
  111.                     'network-ip': self.get_network_ip,
  112.                     'network-netmask': self.get_network_netmask,
  113.                     'network-type':    self.get_network_type,
  114.                     'profile-uri': self.get_profile_uri,
  115.                     'root-mount-point': self.get_root_mount_point,
  116.                     'root-passwd': self.get_root_passwd,
  117.                     'rsync-proxy': self.get_rsync_proxy,
  118.                     'verbose': self.get_verbose,
  119.                 }
  120.         self.data = "<client-configuration>"
  121.  
  122.         for key in fntable.keys():
  123.             self.data += "<%s>%s</%s>" % (key, fntable[key](), key)
  124.  
  125.         # Serialize the special cases.
  126.         self.serialize_dns_servers()
  127.         self.serialize_kernel_modules()
  128.  
  129.         # Add closing tag
  130.         self.data += "</client-configuration>"
  131.         
  132.         #Finish by putting it all in nice XML.
  133.         dom = xml.dom.minidom.parseString(self.data)
  134.         return dom.toprettyxml()
  135.         
  136.     ############################################################################
  137.     #### Architecture Template
  138.     
  139.     ##
  140.     # Sets the architecture to be used for the install.
  141.     # @param xml_path not used here.
  142.     # @param architecture_template the architecture to be installed
  143.     # @param xml_attr not used here.
  144.     def set_architecture_template(self, xml_path, architecture_template, xml_attr):
  145.         if not architecture_template in ["x86", "amd64", "ppc", "sparc", "hppa", "alpha"]:
  146.             raise GLIException("UnsupportedArchitectureTemplateError", 'fatal','set_architecture_template', 'Architecture Template specified is not supported!')
  147.         self._architecture_template = architecture_template
  148.     ##
  149.     # Returns the architecture_template
  150.     def get_architecture_template(self):
  151.         return self._architecture_template
  152.     
  153.     # This variable has a simple serialize function.
  154.     
  155.     ############################################################################
  156.     #### DNS Servers List
  157.  
  158.     ##
  159.     # Sets the dns servers
  160.     # @param xml_path not used here.
  161.     # @param nameservers space-separated list of nameservers
  162.     # @param xml_attr not used here.
  163.     def set_dns_servers(self, xml_path, nameservers, xml_attr):
  164.         if type(nameservers) == str:
  165.             nameservers = nameservers.split(" ")
  166.             dns = []
  167.             for server in nameservers:
  168.                 dns.append(server)
  169.         self._dns_servers = tuple(dns)
  170.  
  171.     ##
  172.     # Returns the list of dns servers
  173.     # @param self Parameter description
  174.     def get_dns_servers(self):
  175.         return self._dns_servers
  176.  
  177.     ##
  178.     # Serialization for the DNS servers
  179.     def serialize_dns_servers(self):
  180.         # Special Case the kernel modules
  181.         self.data += "<dns-servers>%s</dns-servers>" % " ".join(self.get_dns_servers())
  182.  
  183.     # This variable has a simple serialize function.
  184.     
  185.     ############################################################################
  186.     #### Enable SSH Decision for livecd environment
  187.  
  188.     ##
  189.     # Choose whether or not to enable SSH.
  190.     # @param xml_path not used here.
  191.     # @param enable_ssh a True/False bool value here or a string
  192.     # @param xml_attr not used here.
  193.     def set_enable_ssh(self, xml_path, enable_ssh, xml_attr):
  194.         if type(enable_ssh) == str:
  195.             enable_ssh = GLIUtility.strtobool(enable_ssh)
  196.         self._enable_ssh = enable_ssh
  197.  
  198.     ##
  199.     # Returns the choice of whether or not to enable SSH (True/False)
  200.     # @param self Parameter description
  201.     def get_enable_ssh(self):
  202.         return self._enable_ssh
  203.  
  204.     # This variable has a simple serialize function.
  205.     
  206.     ############################################################################
  207.     #### FTP Proxy Address Information for livecd environment
  208.  
  209.     ##
  210.     # Sets the FTP proxy URI
  211.     # @param xml_path not used here.
  212.     # @param proxy a URI
  213.     # @param xml_attr not used here.
  214.     def set_ftp_proxy(self, xml_path, proxy, xml_attr):
  215.         self._ftp_proxy = proxy
  216.  
  217.     ##
  218.     # Returns the FTP proxy.
  219.     # @param self Parameter description
  220.     def get_ftp_proxy(self):
  221.         return self._ftp_proxy
  222.  
  223.     # This variable has a simple serialize function.
  224.     
  225.     ############################################################################
  226.     #### HTTP Proxy Address Information for livecd environment
  227.  
  228.     ##
  229.     # Sets the HTTP proxy URI
  230.     # @param xml_path not used here.
  231.     # @param proxy a URI
  232.     # @param xml_attr not used here.
  233.     def set_http_proxy(self, xml_path, proxy, xml_attr):
  234.         self._http_proxy = proxy
  235.  
  236.     ##
  237.     # Returns the HTTP proxy
  238.     def get_http_proxy(self):
  239.         return self._http_proxy
  240.  
  241.     # This variable has a simple serialize function.
  242.     
  243.     ############################################################################
  244.     #### Install Mode
  245.  
  246.     ##
  247.     # Sets the install mode. (currently "normal", "stage4", or "chroot")
  248.     # @param xml_path not used here.
  249.     # @param install_mode Install mode
  250.     # @param xml_attr not used here.
  251.     def set_install_mode(self, xml_path, install_mode, xml_attr):
  252.         self._install_mode = install_mode
  253.  
  254.     ##
  255.     # Returns install mode
  256.     # @param self Parameter description
  257.     def get_install_mode(self):
  258.         return self._install_mode
  259.  
  260.     # This variable has a simple serialize function.
  261.     
  262.     ############################################################################
  263.     #### Interactive Install
  264.  
  265.     ##
  266.     # Sets whether or not to be an interactive install. (boolean)
  267.     # @param xml_path not used here.
  268.     # @param interactive True/False bool value or a string.
  269.     # @param xml_attr not used here.
  270.     def set_interactive(self, xml_path, interactive, xml_attr):
  271.         if type(interactive) != bool:
  272.             interactive = GLIUtility.strtobool(interactive)
  273.         self._interactive = interactive
  274.  
  275.     ##
  276.     # Returns bool value on interactive install choice.
  277.     # @param self Parameter description
  278.     def get_interactive(self):
  279.         return self._interactive
  280.  
  281.     # This variable has a simple serialize function.
  282.     
  283.     ############################################################################
  284.     #### Set Kernel Modules to be loaded for the livecd environment
  285.  
  286.     ##
  287.     # Sets a list of modules to load on the livecd environment.
  288.     # @param xml_path not used here.
  289.     # @param modules string of modules
  290.     # @param xml_attr not used here.
  291.     def set_kernel_modules(self, xml_path, modules, xml_attr):
  292.         self._kernel_modules = tuple(string.split(modules))
  293.  
  294.     ##
  295.     # Returns the list of kernel modules to load on the livecd environment.
  296.     def get_kernel_modules(self):
  297.         return self._kernel_modules
  298.  
  299.     ##
  300.     # Serialization for the kernel module list.  joins together the modules.
  301.     def serialize_kernel_modules(self):
  302.         # Special Case the kernel modules
  303.         self.data += "<kernel-modules>%s</kernel-modules>" % string.join(self.get_kernel_modules())
  304.     
  305.     ############################################################################
  306.     #### Log File Location
  307.  
  308.     ##
  309.     # Sets the log filename.
  310.     # @param xml_path not used here.
  311.     # @param log_file the name of the logfile for the CC to use.
  312.     # @param xml_attr not used here.
  313.     def set_log_file(self, xml_path, log_file, xml_attr):
  314.         self._log_file = log_file
  315.  
  316.     ##
  317.     # Returns the log filename
  318.     def get_log_file(self):
  319.         return self._log_file
  320.     
  321.     # This variable has a simple serialize function.
  322.     
  323.     ############################################################################
  324.     #### Network Broadcast Address for livecd environment
  325.  
  326.     ##
  327.     # Sets the network broadcast address for the livecd environment
  328.     # @param xml_path not used here.
  329.     # @param broadcast the network broadcast address
  330.     # @param xml_attr= None
  331.     def set_network_broadcast(self, xml_path, broadcast, xml_attr=None):
  332.         if not GLIUtility.is_ip(broadcast):
  333.             raise GLIException("IPAddressError", 'fatal','set_network_broadcast', 'The specified broadcast is not a valid IP Address!')
  334.         self._network_broadcast = broadcast
  335.     
  336.     ##
  337.     # Returns the network broadcast address
  338.     def get_network_broadcast(self):
  339.         return self._network_broadcast
  340.  
  341.     # This variable has a simple serialize function.
  342.     
  343.     ############################################################################
  344.     #### Network DHCP Options for livecd environment
  345.  
  346.     ##
  347.     # Sets the network dhcp options for the livecd environment
  348.     # @param xml_path not used here.
  349.     # @param broadcast the dhcp options
  350.     # @param xml_attr= None
  351.     def set_network_dhcp_options(self, xml_path, options, xml_attr=None):
  352.         if not GLIUtility.is_realstring(options):
  353.             raise GLIException("BadDHCPOptionsError", 'fatal','set_network_dhcp_options', 'The specified dhcp_optioons is not a valid string!')
  354.         self._network_dhcp_options = options
  355.     
  356.     ##
  357.     # Returns the network dhcp options
  358.     def get_network_dhcp_options(self):
  359.         return self._network_dhcp_options
  360.  
  361.     # This variable has a simple serialize function.
  362.     
  363.     ############################################################################
  364.     #### Network Gateway Address for livecd environment
  365.     
  366.     ##
  367.     # Sets the network gateway for the livecd environment
  368.     # @param xml_path not used here.
  369.     # @param gateway the network gateway
  370.     # @param xml_attr= None
  371.     def set_network_gateway(self, xml_path, gateway, xml_attr=None):
  372.         if not GLIUtility.is_ip(gateway):
  373.             raise GLIException("IPAddressError", 'fatal', 'set_network_gateway', "The gateway IP provided is not a valid gateway!!")
  374.         self._network_gateway = gateway
  375.     
  376.     ##
  377.     # Returns the network gateway
  378.     def get_network_gateway(self):
  379.         return self._network_gateway
  380.         
  381.     # This variable has a simple serialize function.
  382.         
  383.     ############################################################################
  384.     #### Network Interface Information for livecd environment
  385.  
  386.     ##
  387.     # Sets the network interface configuration info for the livecd environment
  388.     # @param xml_path not used here.
  389.     # @param interface the interface to talk over
  390.     # @param xml_attr= None
  391.     def set_network_interface(self, xml_path, interface, xml_attr=None):
  392.         if not GLIUtility.is_eth_device(interface):
  393.             raise GLIException("InterfaceError", 'fatal', 'set_network_interface', "Interface " + interface + " must be a valid device!")
  394.         self._network_interface = interface
  395.     
  396.     ##
  397.     # Returns the network interface
  398.     def get_network_interface(self):
  399.         return self._network_interface
  400.  
  401.     # This variable has a simple serialize function.
  402.     
  403.     ############################################################################
  404.     #### Network IP Address for livecd environment
  405.  
  406.     ##
  407.     # Sets the network ip address for the livecd environment
  408.     # @param xml_path not used here.
  409.     # @param ip the ip address
  410.     # @param xml_attr= None
  411.     def set_network_ip(self, xml_path, ip, xml_attr=None):
  412.         if not GLIUtility.is_ip(ip):
  413.             raise GLIException("IPAddressError", 'fatal', 'set_network_ip', 'The specified IP ' + ip + ' is not a valid IP Address!')
  414.         self._network_ip = ip
  415.     
  416.     ##
  417.     # Returns the network ip address
  418.     def get_network_ip(self):
  419.         return self._network_ip
  420.         
  421.     # This variable has a simple serialize function.
  422.     
  423.     ############################################################################
  424.     #### Network Netmask Address for livecd environment
  425.  
  426.     ##
  427.     # Sets the network netmask for the livecd environment
  428.     # @param xml_path not used here.
  429.     # @param netmask the network netmask
  430.     # @param xml_attr= None
  431.     def set_network_netmask(self, xml_path, netmask, xml_attr=None):
  432.         if not GLIUtility.is_ip(netmask):
  433.             raise GLIException("IPAddressError", 'fatal','set_network_netmask', 'The specified netmask is not a valid IP Address!')
  434.         else:
  435.             # Need to guess the netmask... just in case (probably need the gateway..)
  436.             pass
  437.             
  438.         self._network_netmask = netmask
  439.     
  440.     ##
  441.     # Returns the network netmask
  442.     def get_network_netmask(self):
  443.         return self._network_netmask
  444.         
  445.     # This variable has a simple serialize function.
  446.     
  447.     
  448.     ############################################################################
  449.     #### Network Type Information for livecd environment (static or dhcp)
  450.  
  451.     ##
  452.     # Sets the network configuration info for the livecd environment
  453.     # @param xml_path not used here.
  454.     # @param network_type the network type, either static or dhcp
  455.     # @param xml_attr=None
  456.     def set_network_type(self, xml_path, network_type, xml_attr):
  457.         if network_type == "None":  # allow for None
  458.             return
  459.         if not (network_type == 'static' or network_type == 'dhcp'):
  460.             raise GLIException("NoSuchTypeError", 'fatal','set_network_type',"You can only have a static or dhcp network!")
  461.  
  462.         self._network_type = network_type
  463.  
  464.     ##
  465.     # Returns the network type
  466.     def get_network_type(self):
  467.         return self._network_type
  468.  
  469.     # This variable has a simple serialize function.
  470.     
  471.     ############################################################################
  472.     #### Install Profile URI
  473.     
  474.     ##
  475.     # Sets the profile_uri for use in non-interactive installs
  476.     # @param xml_path not used here.
  477.     # @param profile_uri location of the profile
  478.     # @param xml_attr not used here.
  479.     def set_profile_uri(self, xml_path, profile_uri, xml_attr):
  480.         if profile_uri != None and not GLIUtility.is_uri(profile_uri):
  481.             raise GLIException("URIError", 'fatal', 'set_profile_uri',"The URI specified is not valid!")
  482.         self._profile_uri = profile_uri
  483.     
  484.     ##
  485.     # Returns the profile_uri
  486.     def get_profile_uri(self):
  487.         return self._profile_uri
  488.  
  489.     # This variable has a simple serialize function.
  490.  
  491.     ############################################################################
  492.     #### Root Mount Point For New System
  493.  
  494.     ##
  495.     # Sets the root_mount_point for the new system to be installed to
  496.     # @param xml_path not used here.
  497.     # @param root_mount_point new location for the root mount point
  498.     # @param xml_attr not used here.
  499.     def set_root_mount_point(self, xml_path, root_mount_point, xml_attr):
  500.         self._root_mount_point = root_mount_point
  501.  
  502.     ##
  503.     # Returns the root_mount_point
  504.     def get_root_mount_point(self):
  505.         return self._root_mount_point
  506.  
  507.     # This variable has a simple serialize function.
  508.  
  509.     ############################################################################
  510.     #### Root Password Selection for livecd environment
  511.  
  512.     ##
  513.     # Sets the root password on the livecd.  This is supposed to be given a hash.
  514.     # @param xml_path not used here.
  515.     # @param passwd a hashed password to be set on the livecd environment.
  516.     # @param xml_attr not used here.
  517.     def set_root_passwd(self, xml_path, passwd, xml_attr):
  518.         self._root_passwd = passwd
  519.  
  520.     ##
  521.     # Returns the hash of the root password for the livecd environment
  522.     def get_root_passwd(self):
  523.         return self._root_passwd
  524.  
  525.     # This variable has a simple serialize function.
  526.     
  527.     ############################################################################
  528.     #### RSYNC Proxy Address Information for livecd environment
  529.  
  530.     ##
  531.     # Sets the RSYNC proxy URI
  532.     # @param xml_path not used here.
  533.     # @param proxy a URI
  534.     # @param xml_attr not used here.
  535.     def set_rsync_proxy(self, xml_path, proxy, xml_attr):
  536.         self._rsync_proxy = proxy
  537.  
  538.     ##
  539.     # Returns the RSYNC proxy
  540.     def get_rsync_proxy(self):
  541.         return self._rsync_proxy
  542.  
  543.     ##
  544.     # Sets the Verbose mode (DEBUG mode)
  545.     # @param xml_path not used here.
  546.     # @param verbose flag. boolean.
  547.     # @param xml_attr not used here.
  548.     def set_verbose(self, xml_path, verbose, xml_attr):
  549.         if type(verbose) == str:
  550.             verbose = GLIUtility.strtobool(verbose)
  551.         self._verbose = verbose
  552.  
  553.     ##
  554.     # Returns the verbose (DEBUG) flag
  555.     def get_verbose(self):
  556.         return self._verbose
  557.